package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    //需要先定义一个socket 对象
    //通过网络通信，必须要使用socket对象。
    /*socket文件是用来进行通信的一个东西  packet是要传输的数据,socket中有一系列的方法（发送，接收）
    * packet是在发送和接收的时候以packet为基本单位来进行传输的*/
    private DatagramSocket socket = null;

    //绑定一个端口，不一定能成功（如果这个端口是被占用的状态则关联不成功）则会报错
    //同一个主机上，一个端口，同一时刻  只能被一个进程绑定
    public UdpEchoServer(int port) throws SocketException {
        //构造socket的同时，指定要绑定的端口
        socket = new DatagramSocket(port);
    }

    //启动服务器的主逻辑
    public void start() throws IOException {
        System.out.println("服务器启动！");
        while (true) {
            //每一次循环，要做3件事：
            //1.读取请求并进行解析
            //构造空饭盒（就是构造一个盛数据的数组，然后交给一个方法进行处理，
            // 处理完成这个数组里也就有要返回的数据了）
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);
            //食堂大妈给盛饭，这个饭是从网卡上来的
            socket.receive(requestPacket);
            //为了方便处理这个请求，我们把数据包转成String字符串
            //string这个方法的参数就是从0下标开始构造，一直到数组的有效数据的最后一个。
            String request = new String(requestPacket.getData(),0, requestPacket.getLength());
            //2.根据请求计算相应（此处省相应的实现，只有一个回显的功能)
            String response = process(request);
            //3.把把响应传回给客户端
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
                    //responsePacket是从客户端中接收来的，getSocketAddress方法就可以获取客户端的ip和端口
                    response.getBytes().length,requestPacket.getSocketAddress());
            //上述代码只是打包完成了，还要发送回给客户端
            socket.send(responsePacket);
            //打印日志
            System.out.printf("[%s:%d] req:%s, resp:%s\n",responsePacket.getAddress().toString(),
                    responsePacket.getPort(),request,response);
        }
    }
    //这个方法希望是根据请求计算相应，但是写的程序只是一个回显作用
    //如果后续写个别的服务器，就在这个方法中修改具体的计算相应的逻辑
    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer = new UdpEchoServer(909);
        udpEchoServer.start();
    }
}
